package com.hardy.leecode;

/**
 * Author: Hardy
 * Date:   2020/7/20
 * Description:
 * - 整数反转
 * <p>
 * 给出一个 32 位的有符号整数，你需要将这个整数中每位上的数字进行反转。
 * <p>
 * 示例 1:
 * <p>
 * 输入: 123
 * 输出: 321
 *  示例 2:
 * <p>
 * 输入: -123
 * 输出: -321
 * 示例 3:
 * <p>
 * 输入: 120
 * 输出: 21
 * 注意:
 * <p>
 * 假设我们的环境只能存储得下 32 位的有符号整数，则其数值范围为 [−231,  231 − 1]。请根据这个假设，如果反转后整数溢出那么就返回 0。
 * <p>
 * 链接：https://leetcode-cn.com/problems/reverse-integer
 **/
public class Que7 {

    public static void main(String[] args) {
        int x = -123;

        System.out.println(new Solution().reverse(x));
    }

    static class Solution {

        public int reverse(int x) {
            int res = 0;
            int a = Math.abs(x);

            while (a != 0) {
                int b = a % 10;
                b = x < 0 ? -b : b;

                if ((x > 0 && res > (Integer.MAX_VALUE - b) / 10) || (x < 0 && res < (Integer.MIN_VALUE - b) / 10))
                    return 0;

                res = res * 10 + b;

                a /= 10;
            }
            return res;
        }

        public int reverse1(int x) {
            String a = String.valueOf(x);
            if (a.length() == 1) return x;

            int r = x < 0 ? 1 : 0;

            StringBuilder b = new StringBuilder();
            for (int i = a.length() - 1; i >= r; i--) {
                b.append(a.charAt(i));
            }

            while (b.length() > 1 && b.charAt(0) == '0') {
                b.deleteCharAt(0);
            }

            if (x < 0) b.insert(0, '-');

            String res = b.toString();
            Integer y = 0;
            try {
                y = Integer.valueOf(res);
            } catch (Exception e) {
                return y;
            }
            return y;
        }
    }
}
